using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._GeoAnalyticsDesktopTools._ManageData
{
    /// <summary>
    /// <para>Overlay Layers</para>
    /// <para>Overlays the geometries from multiple layers into a single layer.  Overlay can be used to combine, erase, modify, or update spatial features.</para>
    /// <para>将多个图层中的几何图形叠加到单个图层中。 叠加可用于合并、擦除、修改或更新空间要素。</para>
    /// </summary>    
    [DisplayName("Overlay Layers")]
    public class OverlayLayers : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public OverlayLayers()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_input_layer">
        /// <para>Input Layer</para>
        /// <para>The point, line, or polygon features that will be overlaid with the overlay layer.</para>
        /// <para>将叠加图层叠加的点、线或面要素。</para>
        /// </param>
        /// <param name="_overlay_layer">
        /// <para>Overlay Layer</para>
        /// <para>The features that will be overlaid with the input layer features.</para>
        /// <para>将与输入图层要素叠加的要素。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>A new feature class with overlaid features.</para>
        /// <para>具有叠加要素的新要素类。</para>
        /// </param>
        /// <param name="_overlay_type">
        /// <para>Overlay Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of overlay to be performed.</para>
        ///   <bulletList>
        ///     <bullet_item>Intersect—Computes a geometric intersection of the input layers. Features or portions of features that overlap in both the input layer and overlay layer will be written to the output layer. This is the default.</bullet_item><para/>
        ///     <bullet_item>Erase—Only those features or portions of features in the overlay layer that are not within the features in the input layer are written to the output.</bullet_item><para/>
        ///     <bullet_item>Union— Computes a geometric union of the input layer and overlay layer. All features and their attributes will be written to the layer.</bullet_item><para/>
        ///     <bullet_item>Identity— Computes a geometric intersection of the input features and identity features. Features or portions of features that overlap in both input layer and overlay layer will be written to the output layer.</bullet_item><para/>
        ///     <bullet_item>Symmetrical Difference— Features or portions of features in the input layer and overlay layer that do not overlap will be written to the output layer.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要执行的叠加类型。</para>
        ///   <bulletList>
        ///     <bullet_item>相交 （Intersect） - 计算输入图层的几何交点。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>拭除 - 仅将叠加图层中不在输入图层要素内的要素或部分要素写入输出。</bullet_item><para/>
        ///     <bullet_item>并集 — 计算输入层和叠加层的几何并集。所有要素及其属性都将写入图层。</bullet_item><para/>
        ///     <bullet_item>身份 - 计算输入要素和身份要素的几何交集。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。</bullet_item><para/>
        ///     <bullet_item>对称差分 - 输入图层和叠加图层中不重叠的要素或要素部分将被写入输出图层。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public OverlayLayers(object _input_layer, object _overlay_layer, object _out_feature_class, _overlay_type_value _overlay_type)
        {
            this._input_layer = _input_layer;
            this._overlay_layer = _overlay_layer;
            this._out_feature_class = _out_feature_class;
            this._overlay_type = _overlay_type;
        }
        public override string ToolboxName => "GeoAnalytics Desktop Tools";

        public override string ToolName => "Overlay Layers";

        public override string CallName => "gapro.OverlayLayers";

        public override List<string> AcceptEnvironments => ["extent", "outputCoordinateSystem", "parallelProcessingFactor", "workspace"];

        public override object[] ParameterInfo => [_input_layer, _overlay_layer, _out_feature_class, _overlay_type.GetGPValue()];

        /// <summary>
        /// <para>Input Layer</para>
        /// <para>The point, line, or polygon features that will be overlaid with the overlay layer.</para>
        /// <para>将叠加图层叠加的点、线或面要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _input_layer { get; set; }


        /// <summary>
        /// <para>Overlay Layer</para>
        /// <para>The features that will be overlaid with the input layer features.</para>
        /// <para>将与输入图层要素叠加的要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Overlay Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _overlay_layer { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>A new feature class with overlaid features.</para>
        /// <para>具有叠加要素的新要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Overlay Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of overlay to be performed.</para>
        ///   <bulletList>
        ///     <bullet_item>Intersect—Computes a geometric intersection of the input layers. Features or portions of features that overlap in both the input layer and overlay layer will be written to the output layer. This is the default.</bullet_item><para/>
        ///     <bullet_item>Erase—Only those features or portions of features in the overlay layer that are not within the features in the input layer are written to the output.</bullet_item><para/>
        ///     <bullet_item>Union— Computes a geometric union of the input layer and overlay layer. All features and their attributes will be written to the layer.</bullet_item><para/>
        ///     <bullet_item>Identity— Computes a geometric intersection of the input features and identity features. Features or portions of features that overlap in both input layer and overlay layer will be written to the output layer.</bullet_item><para/>
        ///     <bullet_item>Symmetrical Difference— Features or portions of features in the input layer and overlay layer that do not overlap will be written to the output layer.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要执行的叠加类型。</para>
        ///   <bulletList>
        ///     <bullet_item>相交 （Intersect） - 计算输入图层的几何交点。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>拭除 - 仅将叠加图层中不在输入图层要素内的要素或部分要素写入输出。</bullet_item><para/>
        ///     <bullet_item>并集 — 计算输入层和叠加层的几何并集。所有要素及其属性都将写入图层。</bullet_item><para/>
        ///     <bullet_item>身份 - 计算输入要素和身份要素的几何交集。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。</bullet_item><para/>
        ///     <bullet_item>对称差分 - 输入图层和叠加图层中不重叠的要素或要素部分将被写入输出图层。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Overlay Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _overlay_type_value _overlay_type { get; set; }

        public enum _overlay_type_value
        {
            /// <summary>
            /// <para>Intersect</para>
            /// <para>Intersect—Computes a geometric intersection of the input layers. Features or portions of features that overlap in both the input layer and overlay layer will be written to the output layer. This is the default.</para>
            /// <para>相交 （Intersect） - 计算输入图层的几何交点。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。这是默认设置。</para>
            /// </summary>
            [Description("Intersect")]
            [GPEnumValue("INTERSECT")]
            _INTERSECT,

            /// <summary>
            /// <para>Erase</para>
            /// <para>Erase—Only those features or portions of features in the overlay layer that are not within the features in the input layer are written to the output.</para>
            /// <para>拭除 - 仅将叠加图层中不在输入图层要素内的要素或部分要素写入输出。</para>
            /// </summary>
            [Description("Erase")]
            [GPEnumValue("ERASE")]
            _ERASE,

            /// <summary>
            /// <para>Identity</para>
            /// <para>Identity— Computes a geometric intersection of the input features and identity features. Features or portions of features that overlap in both input layer and overlay layer will be written to the output layer.</para>
            /// <para>身份 - 计算输入要素和身份要素的几何交集。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。</para>
            /// </summary>
            [Description("Identity")]
            [GPEnumValue("IDENTITY")]
            _IDENTITY,

            /// <summary>
            /// <para>Union</para>
            /// <para>Union— Computes a geometric union of the input layer and overlay layer. All features and their attributes will be written to the layer.</para>
            /// <para>并集 — 计算输入层和叠加层的几何并集。所有要素及其属性都将写入图层。</para>
            /// </summary>
            [Description("Union")]
            [GPEnumValue("UNION")]
            _UNION,

            /// <summary>
            /// <para>Symmetrical Difference</para>
            /// <para>Symmetrical Difference— Features or portions of features in the input layer and overlay layer that do not overlap will be written to the output layer.</para>
            /// <para>对称差分 - 输入图层和叠加图层中不重叠的要素或要素部分将被写入输出图层。</para>
            /// </summary>
            [Description("Symmetrical Difference")]
            [GPEnumValue("SYMMETRICAL_DIFFERENCE")]
            _SYMMETRICAL_DIFFERENCE,

        }

        public OverlayLayers SetEnv(object extent = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object workspace = null)
        {
            base.SetEnv(extent: extent, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, workspace: workspace);
            return this;
        }

    }

}